package com.jyj.comm;

import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @class: com.jyj.comm.RedisUtil
 * @description:jredis操作的封装类
 * @author: jiangzengkui
 * @company: 教育家
 * @create: 2021-01-19 16:55
 */
public class RedisUtil {


    /****************************************字符串操作***********************/

    /**
     * 新增字符串key,无则新增，有则覆盖
     * @param jedis
     * @param key
     * @param cont
     */
    public static  void str_add(Jedis jedis,String key,String cont){

        jedis.set(key,cont);
    }



    /**
     * 新增多个，
     * @param jedis
     * @param keysvalues "key1","kval1","key2","keyval2" ..
     */
    public static  void str_adds(Jedis jedis,String... keysvalues){
        jedis.mset(keysvalues);
    }



    /**
     * 得到一个内容，如果key不存在，则返回null
     * @param jedis
     * @param key
     * @return
     */
    public static String str_getByKey(Jedis jedis,String key){

        return jedis.get(key);
    }

    /**
     * 得到多个key值
     * @param jedis
     * @param keys eg: "k1","k2"
     * @return
     */
    public static List<String> str_getbyKeys(Jedis jedis, String... keys){
        return jedis.mget(keys);
    }



    /****************************hash操作************************************/
    /**
     * 通过map写入
     * @param jedis
     * @param key
     * @param map
     */
    public static  void hash_addByMap(Jedis jedis,String key,Map <String,String> map){
        jedis.hmset(key,map);
    }

    /**
     * 增加hash类型，一个字段一个字段的增加
     * @param jedis
     * @param key
     * @param field
     * @param val
     */
    public static  void hash_addFieldVal(Jedis jedis,String key,String field,String val){

        jedis.hset(key, field,val);

    }

    /**
     * 得到一个hash类型的所有字段值
     * @param jedis
     * @param key
     * @return
     */
    public static  Map <String,String>  hash_getAll(Jedis jedis,String key){
        return jedis.hgetAll(key);
    }

    /**
     * 通过传递字段获得值
     * @param jedis
     * @param key
     * @param fields
     * @return
     */
    public static List<String> hash_getValByField(Jedis jedis,String key,String... fields){


        return jedis.hmget(key, fields);

    }

    /**
     * 移除hash的值
     * @param jedis
     * @param key
     * @param fields
     */
    public static  void hash_removdVal(Jedis jedis,String key,String... fields){
        jedis.hdel(key, fields); //删除一个或者多个键值对
    }

    /**
     * 得到长度
     * @param jedis
     * @param key
     * @return
     */
    public static long hash_getLen(Jedis jedis,String key){
        return  jedis.hlen(key);
    }

    /**
     * 字段是否存在
     * @param jedis
     * @param key
     * @param filed
     * @return
     */
    public static  boolean hash_fieldIsExist(Jedis jedis,String key,String filed){
        return jedis.hexists(key,filed) ;//判断hash中是否存在key2
    }



    /****************************************整数加减的操作***********************/
    /***注意：redis没有存储指定数字的方法，可以以字符串存储读出来再转化**/


    /**
     * 如果没有key，则创建，初始值为1，如果有，则在原值加1
     * @param jedis
     * @param key
     */
    public static  void  incr(Jedis jedis,String key){
        jedis.incr("key1");
    }


    /**
     * 如果没有key，则创建，初始值为-1，如果有，则在原值减1
     * @param jedis
     * @param key
     */
    public static  void  decr(Jedis jedis,String key){
        jedis.decr(key) ;
    }

    /**
     * 加减n
     * @param jedis
     * @param key
     * @param n
     */
    public static  void  incrBy(Jedis jedis,String key,int n){
        jedis.incrBy(key,n) ;
    }






/****************************list操作************************************/

    /**
     * 增加list数据类型，注意，不会去重
     * @param jedis
     * @param key
     * @param values
     */
    public static void list_add(Jedis jedis,String key,String... values){
        jedis.lpush(key,values);
    }

    /**
     * 得到所有list数据
     * @param jedis
     * @param key
     * @return
     */
    public static List<String> list_getAll(Jedis jedis,String key){
        return  jedis.lrange(key,0,-1) ;
    }

    /**
     * 得到list
     * @param jedis
     * @param key
     * @param start 开始索引
     * @param end  结束索引 -1表示到最后一个索引
     * @return
     */
    public static  List<String> list_getByIndex(Jedis jedis,String key,int start,int end){
        List<String> list = jedis.lrange(key, start ,end);
        return  list;
    }

/****************************set操作************************************/
/**
 Set是一堆不重复值，无序的组合。set 的内部实现是一个 value永远为null的HashMap，实际就是通过计算hash的方式来快速排重的，这也是set能提供判断一个成员是否在集合内的原因。
 */
    /**
     * 新增set类型，会去重
     * @param jedis
     * @param key
     * @param vals
     */
    public static void set_add(Jedis jedis,String key,String... vals){
    jedis.sadd(key,vals);
}

    /**
     * 删除set对应的值
     * @param jedis
     * @param key
     * @param vals
     */
    public static void  set_remove(Jedis jedis,String key,String... vals){
        jedis.srem(key,vals);
    }

    /**
     * 得到set集合的值
     * @param jedis
     * @param key
     * @return
     */
    public  Set<String> set_getAll(Jedis jedis,String key){
        return  jedis.smembers(key);
    }

    /**
     * 得到set长度,不存在返回0
     * @param jedis
     * @param key
     * @return
     */
    public static Long set_getLen(Jedis jedis,String key){
      return jedis.scard(key);
    }

    /**
     * 值在set里是否存在
     * @param jedis
     * @param key
     * @param val
     * @return
     */
    public static boolean set_isExist(Jedis jedis,String key,String val){
        return jedis.sismember(key, val);
    }


/****************************zset操作************************************/
/**
 set是有序的排列，去重
 */
    /**
     * 新增一个zset成员 score是用来排序的
     * @param jedis
     * @param key
     * @param score
     * @param member
     */
    public static void zset_add(Jedis jedis,String key,double score,String member){
    jedis.zadd(key, score,member);
    }

    /**
     * 新增多个zset
     * @param jedis
     * @param key
     * @param map
     */
    public static void zset_adds(Jedis jedis,String key,Map<String ,Double> map){
        jedis.zadd(key,map);
    }

    /**
     * 得到一个zset的集合
     * @param jedis
     * @param key
     * @return
     */
    public static Set<String> zset_getAll(Jedis jedis,String key){
        return jedis.zrange(key, 0, -1);
    }

    /****************************通用操作************************************/
    /**
     * 删除一个key
     * @param jedis
     * @param key
     */

    public static void comm_delKey(Jedis jedis,String key) {
        if(jedis.exists(key)){

            jedis.del(key);
            System.out.println("删除成功,key="+key);
        }
    }

    /**
     * 设置过期时间
     * @param jedis
     * @param key
     * @param seconds
     */
    public static void comm_setExpireTime(Jedis jedis,String key,int seconds){
        jedis.expire(key, seconds);
    }
    /**
     * 删除多个key
     * @param jedis
     * @param keys  eg:"k1","k2"
     */
    public static void comm_delKeys(Jedis jedis,String... keys){
        jedis.del(keys);

    }

    /**
     * 删除所有key
     * @param jedis
     */
    public static void comm_delAll(Jedis jedis){
        System.out.println("清空库中所有数据："+jedis.flushDB());
    }

    /**
     * 得到所有key
     * @param jedis
     * @return
     */
    public  static Set<String> comm_getAllKey(Jedis jedis){
        // 获取数据并输出
        Set<String> keys = jedis.keys("*");
        return keys;
    }


    /**
     * 链接jdis
     * @return
     */
    public  static  Jedis getJedis(){
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost",6379,2000);
        //   jedis.auth("segns");//设置密码
        System.out.println("连接成功");
        return jedis;
    }
}